//***************************************************************************//
//* 版权所有  www.sh-easy.com
//*
//* 内容摘要：音视频收发线程
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2015-12-26
//**************************************************************************//

#if !defined(SDPRIVTSMUX_H)
#define SDPRIVTSMUX_H

#include "SDAVCommn.h"
#include "SDTermCommon.h"
#include "SDPrivateMux.h"


class CPrivTsMuxer
{

public:
	CPrivTsMuxer();
	virtual ~CPrivTsMuxer();

public:

	//对外接口
    BOOL    Create(std::string strPath,UINT64 unUid,BYTE byAudioCodec,BYTE byVideoCodec,UINT unToken,BOOL bUseInternalTimestamp =TRUE);
	void	Close();

	//发送一帧视频码流，需附带H264/H265起始码
	void	WriteVideoData(BYTE byCodec, UINT unLen, BYTE* buf,BYTE byIsKey,UINT unDts = 0);
	//发送一帧音频码率，建议ADTS格式
	void	WriteAudioData(BYTE byCodec, UINT unLen, BYTE* buf, UINT unDts = 0);

    void    UpdateCrypto(BYTE byEnCrypto,UINT unCryptoMethod);

    //设置SM4加密密钥
    void    UpdateEncKey(UINT unToken,BYTE*key,UINT unLen);

private:
	static int VideoMuxerThreadClose(void* pParam);
	static int VideoMuxerThread(void* pParam);

	static int AudioMuxerThreadClose(void* pParam);
	static int AudioMuxerThread(void* pParam);
private:
	//RTP音视频推送、接收线程相关
	CSDThread			m_VideoMuxerThread;
	CSDThread			m_AudioMuxerThread;

	volatile BOOL		m_bVideoMuxerThreadRun;
	volatile BOOL		m_bAudioMuxerThreadRun;

    CPrivateMux         m_PrivMux;
	//用于视频编码与视频发送线程之间交互数据的空满包队列
	DualQueId			m_ptVideoMuxerQue;
	//用于音频编码与音频发送线程之间交互数据的空满包队列
	DualQueId			m_ptAudioMuxerQue;


	//保护锁资源
	//Close动作与Create动作之间的互斥锁
	void*				m_pcsClose;
	bool				m_bClosed;

	//Close动作与外层发送接口之间的保护锁
	void*				m_pcsVideoEnc;
	void*				m_pcsAudioEnc;

	//帧序号
	UINT				m_unEncVideoFrameCount;
	UINT				m_unEncAudioFrameCount;

	//单帧单Slice模式时初始的时间戳(1KHZ时基),常见于移动端硬编码模式
	int64_t				m_nFirstTimestampVideo;
	//用于音频时间戳计算
	int64_t				m_nFirstTimestampAudio;


	UINT64				m_unUid;
	BOOL				m_bUseInternalTimestamp;


};
#endif // !defined(SDPRIVTSMUX_H)
